package com.atguigu;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.api.BackgroundCallback;
import org.apache.curator.framework.api.CuratorEvent;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.Version;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * @version 1.0
 * @Author lay_hu
 * @Create 2023/11/29 20:27
 **/
public class Curator {

    private  CuratorFramework build;

    /**
     * 使用curator 与zookeeper 服务端建立连接
     */
    @Before          //表示执行其他方法之前先执行这个
    public  void  test(){
        //curator 客户端 连接服务端两种方式 首先要得到 CuratorFramework

        //第一种方式
        /**
         * 第一个参数 是 zk 服务端的ip地址+端口号 比如"192.168.21.102:2181"
         * 如果是zk集群可以写多个 比如 "192.168.21.102:2181,192.168.21.103:2181,192.168.21.103:2181"
         * 第二个时间是 连接之后 会话的时间
         * 第三个是超时时间
         * 第四个 是重试连接
         */
        //重试策略创建
        RetryPolicy retry = new ExponentialBackoffRetry(3000, 10);
//        CuratorFramework newClient = CuratorFrameworkFactory
//                .newClient("192.168.21.102:2181", 60 * 1000, 15 * 1000, retry);
//        //开启连接
//        newClient.start();
        //第二种连接方式 推荐第二种
         build = CuratorFrameworkFactory.builder()
                .connectString("192.168.21.102:2181")
                .sessionTimeoutMs(60 * 1000)
                .connectionTimeoutMs(15 * 1000)
                //namespace 代替/ ls /atguigu
                .retryPolicy(retry).namespace("atguigu").build();
        build.start();
   while(true){
       System.out.println("hahhha ");
   }

    }


    /**
     * 修改节点 set 修改
     */
    @Test
public  void updateNode() throws Exception {
        Stat stat = new Stat();
//    //将查询信息加入到stat 里打印stat
    build.getData().storingStatIn(stat).forPath("/app1");
    int version=stat.getVersion();
        //一般会根据版本号来修改
        build.setData().withVersion(version).forPath("/app1", "itcast".getBytes());

}

    /**
     * 删除节点
     */
    @Test
    public  void deleteNode() throws Exception {
        //删除单个节点
       build.delete().forPath("/app1");
       //删除带有子节点的节点
        build.delete().deletingChildrenIfNeeded().forPath("/app4");
        //必须删除成功
        build.delete().guaranteed().forPath("/app1");
        //回调
        build.delete().inBackground(new BackgroundCallback() {
            @Override
            public void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {

            }
        }).forPath("/app1");
    }



    @After    //释放资源
    public  void close(){
        if (build!=null){
            build.close();
        }
    }
}
